home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games: 500 MB Amiga Software / 500 MB Amiga Software - Euber 130 - Amiga Games Disc & Mag.iso / spiele / publicdomain / uchess / uchesssrc.lha / main.c < prev    next >
C/C++ Source or Header  |  1992-12-24  |  15KB  |  693 lines

  1. /*#define EIGHT_BIT_SCREEN 1 */
  2.  
  3. /* main.c - C source for GNU CHESS
  4.  *
  5.  * Copyright (c) 1988,1989,1990 John Stanback
  6.  * Copyright (c) 1992 Free Software Foundation
  7.  *
  8.  * This file is part of GNU CHESS.
  9.  *
  10.  * GNU Chess is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2, or (at your option)
  13.  * any later version.
  14.  *
  15.  * GNU Chess is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with GNU Chess; see the file COPYING.  If not, write to
  22.  * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  23.  */
  24.  
  25. int CheckIllegal = 0;
  26. extern int IllegalMove;
  27. #include "version.h"
  28. #include "gnuchess.h"
  29. #include <signal.h>
  30. #include <ctype.h>
  31.  
  32. #ifdef AMIGA
  33. #include <exec/types.h>
  34. #include <exec/exec.h>
  35. #include <proto/exec.h>
  36. #include <proto/dos.h>
  37. #include <proto/graphics.h>
  38. #include <graphics/gfxbase.h>
  39. #include <proto/intuition.h>
  40. #include <utility/tagitem.h>
  41. #include <graphics/modeid.h>
  42. #include <lhlib.h>
  43. #include <libraries/asl.h>
  44. #include <proto/icon.h>
  45. #include <proto/asl.h>
  46. #include <workbench/startup.h>
  47. #include <workbench/workbench.h>
  48.  
  49.  
  50. /* Structure for transparent images */
  51.  
  52. #define PTRHEIGHT 55
  53.  
  54. #define BLANKDATA 0xffff
  55.  
  56. int lastpiece=BLANKDATA;
  57.  
  58. #include "agastuff:amiga.h"
  59.  
  60.  
  61. char *ColorStr[2];
  62. char __far *CP[CPSIZE];
  63. /*
  64.  * In a networked enviroment gnuchess might be compiled on different hosts
  65.  * with different random number generators, that is not acceptable if they
  66.  * are going to share the same transposition table.
  67.  */
  68.  
  69. unsigned int
  70. urand (void)
  71. {
  72.   next *= 1103515245;
  73.   next += 12345;
  74.   return ((unsigned int) (next >> 16) & 0xFFFF);
  75. }
  76.  
  77. void
  78. srand (unsigned int seed)
  79. {
  80.   next = seed;
  81. }
  82.  
  83. unsigned long hashkey, hashbd;
  84. #ifdef LONGINTS2
  85. struct hashval __far hashcode[2][7][64];
  86. #else
  87. struct hashval hashcode[2][7][64];
  88. #endif
  89.  
  90. #ifdef CACHE
  91. #ifdef ttblsz
  92. struct hashentry huge *ttable[2];
  93. unsigned int ttblsize;
  94. #endif
  95.  
  96. #else
  97.  
  98. #ifdef ttblsz
  99. struct hashentry __far ttable[2][vttblsz + MAXrehash];
  100. unsigned int ttblsize;
  101. #endif
  102.  
  103. #endif
  104.  
  105. char savefile[128] = "";
  106. char listfile[128] = "";
  107. #ifdef HISTORY
  108. unsigned char __far history[32768];
  109. #endif
  110. INTSIZE rpthash[2][256];
  111. struct leaf __far Tree[TREE];
  112. struct leaf  *root;
  113. INTSIZE TrPnt[MAXDEPTH];
  114. INTSIZE PieceList[2][64], PawnCnt[2][8];
  115. INTSIZE castld[2], Mvboard[64];
  116. INTSIZE svalue[64];
  117. struct flags flag;
  118. INTSIZE opponent, computer, WAwindow, WBwindow, BAwindow, BBwindow, dither, INCscore;
  119. long ResponseTime, ExtraTime, MaxResponseTime, et, et0, time0, ft;
  120. long GenCnt, NodeCnt, ETnodes, EvalNodes, HashCnt, HashAdd, FHashCnt, FHashAdd, HashCol,
  121.  THashCol, filesz;
  122. long replus, reminus;
  123. INTSIZE HashDepth = HASHDEPTH, HashMoveLimit = HASHMOVELIMIT;
  124. INTSIZE player, xwndw, rehash;
  125. struct GameRec GameList[MAXMOVES + MAXDEPTH];
  126. INTSIZE Sdepth, GameCnt, Game50, MaxSearchDepth;
  127. INTSIZE epsquare, contempt;
  128. int Book;
  129. struct TimeControlRec TimeControl;
  130. INTSIZE TCflag, TCmoves, TCminutes, TCseconds, OperatorTime;
  131. INTSIZE XCmoves[3], XCminutes[3], XCseconds[3], XC, XCmore;
  132. const INTSIZE otherside[3] =
  133. {black, white, neutral};
  134. unsigned INTSIZE hint;
  135. INTSIZE int TOflag;        /* force search re-init if we backup search */
  136.  
  137. INTSIZE mtl[2], pmtl[2], hung[2];
  138. INTSIZE Pindex[64];
  139. INTSIZE PieceCnt[2];
  140. INTSIZE FROMsquare, TOsquare;
  141. INTSIZE HasKnight[2], HasBishop[2], HasRook[2], HasQueen[2];
  142. INTSIZE ChkFlag[MAXDEPTH], CptrFlag[MAXDEPTH], PawnThreat[MAXDEPTH];
  143. INTSIZE Pscore[MAXDEPTH], Tscore[MAXDEPTH];
  144. const INTSIZE qrook[3] =
  145. {0, 56, 0};
  146. const INTSIZE krook[3] =
  147. {7, 63, 0};
  148. const INTSIZE kingP[3] =
  149. {4, 60, 0};
  150. const INTSIZE rank7[3] =
  151. {6, 1, 0};
  152. const INTSIZE sweep[8] =
  153. {false, false, false, true, true, true, false, false};
  154. unsigned INTSIZE killr0[MAXDEPTH], killr1[MAXDEPTH];
  155. unsigned INTSIZE killr2[MAXDEPTH], killr3[MAXDEPTH];
  156. unsigned INTSIZE PV, SwagHt, Swag0, Swag1, Swag2, Swag3, Swag4, sidebit;
  157. #ifdef KILLT
  158. INTSIZE __far killt[0x4000];
  159. #endif
  160. const INTSIZE value[7] =
  161. {0, valueP, valueN, valueB, valueR, valueQ, valueK};
  162. const INTSIZE control[7] =
  163. {0, ctlP, ctlN, ctlB, ctlR, ctlQ, ctlK};
  164. INTSIZE stage, stage2, Developed[2];
  165. FILE *hashfile;
  166. unsigned int starttime;
  167. INTSIZE int ahead = true, hash = true;
  168.  
  169. #if defined CHESSTOOL || defined XBOARD
  170. void
  171. TerminateChess (int sig)
  172. {
  173.   ExitChess();
  174. }
  175. #endif
  176.  
  177. int timeopp[MINGAMEIN], timecomp[MINGAMEIN];
  178. int compptr, oppptr;
  179.  
  180. inline void
  181. TimeCalc ()
  182. {
  183. /* adjust number of moves remaining in gamein games */
  184.   int increment = 0;
  185.   int topsum = 0;
  186.   int tcompsum = 0;
  187.   int me,him;
  188.   int i;
  189. /* dont do anything til you have enough numbers */
  190.   if (GameCnt < (MINGAMEIN * 2)) return;
  191. /* calculate average time in sec for last MINGAMEIN moves */
  192.   for (i = 0; i < MINGAMEIN; i++)
  193.     {
  194.       tcompsum += timecomp[i];
  195.       topsum += timeopp[i];
  196.     }
  197.   topsum /= (100 * MINGAMEIN);
  198.   tcompsum /= (100 * MINGAMEIN);
  199. /* if I have less time than opponent add another move */
  200.     me = TimeControl.clock[computer]/100; 
  201.     him = TimeControl.clock[opponent]/100;
  202.     if(me < him) increment += 2;
  203. /* if I am losing more time with each move add another */
  204.   /*if ( !((me - him) > 60) && tcompsum > topsum) increment++;*/
  205.   if ( tcompsum > topsum) increment +=2;
  206. /* but dont let moves go below MINMOVES */
  207.   else if (TimeControl.moves[computer] < MINMOVES && !increment) increment++;
  208. /* if I am doing really well use more time per move */
  209.   else if (me > him && tcompsum < topsum) increment = -1;
  210.   TimeControl.moves[computer] += increment;
  211. }
  212.  
  213.  
  214. /* hmm.... shouldn`t main be moved to the interface routines */
  215. int
  216. main (int aargc, char **aargv)
  217. {
  218.   char cstring[40];
  219.   char *xwin = 0;
  220.   char *Lang = NULL;
  221.  
  222. #ifdef AMIGA
  223.  struct WBStartup *startmsg;
  224.  struct ExecBase **execbaseptr=(struct ExecBase **)4L;
  225.  UWORD cpuid;
  226.  struct ExecBase *execbase;
  227.  BPTR fp;
  228.  APTR tempxx;
  229.  struct WBArg *mywbptr;
  230.  struct DiskObject *dob;
  231.  
  232.  execbase = *execbaseptr;
  233.  cpuid = execbase->AttnFlags;
  234.  
  235.  if (!(cpuid & AFF_68020))
  236.   {
  237.    exit(0);
  238.   }
  239.  gfxversion = GfxBase->LibNode.lib_Version;
  240.  if (gfxversion < 37)
  241.   exit(-1);
  242.  if (!aargc)
  243.   {
  244.    startmsg = (struct WBStartup *)aargv;
  245.    mywbptr = startmsg->sm_ArgList; 
  246.    if (dob = GetDiskObject (mywbptr->wa_Name))
  247.     {
  248.      xwin = FindToolType(dob->do_ToolTypes,"PRI");
  249.      if (xwin)
  250.       {
  251.        procpri = xwin[0] - '0';
  252.        if (procpri < 0)
  253.         procpri = 0;
  254.        if (procpri > 4)
  255.         procpri = 4;
  256.       }
  257.      xwin = FindToolType(dob->do_ToolTypes,"COLORS");
  258.      if (xwin)
  259.       {
  260.        if ((xwin[0] == '1')&&(xwin[1] == '6'))
  261.         gfxversion = 37;
  262.       }
  263.      xwin = FindToolType(dob->do_ToolTypes,"MONITOR");
  264.      if (xwin)
  265.       {
  266.        if ((xwin[0] == '1')&&(xwin[1] == '5'))
  267.         v15Khz = 1;
  268.       }
  269.      FreeDiskObject (dob);
  270.     }
  271.    xwin = 0L;
  272.   }
  273.  else if (aargc > 1)
  274.   {
  275.    if (!(stricmp(aargv[1],"16")))
  276.     {
  277.      gfxversion = 37;
  278.     }
  279.    else if (!(stricmp(aargv[1],"15KHZ")))
  280.     {
  281.      v15Khz = 1;
  282.     }
  283.    else
  284.     {
  285.      procpri=atoi(aargv[1]);
  286.      if (procpri < 0)
  287.        procpri = 0;
  288.      if (procpri > 4)
  289.       procpri = 4;
  290.     }
  291.   }
  292.  if (aargc > 2)
  293.   {
  294.    if (!(stricmp(aargv[2],"16")))
  295.     {
  296.      gfxversion = 37;
  297.     }
  298.    else if (!(stricmp(aargv[2],"15KHZ")))
  299.     {
  300.      v15Khz = 1;
  301.     }
  302.    else
  303.     {
  304.      procpri=atoi(aargv[2]);
  305.      if (procpri < 0)
  306.        procpri = 0;
  307.      if (procpri > 4)
  308.       procpri = 4;
  309.     }
  310.   }
  311.  if (aargc > 3)
  312.   {
  313.    if (!(stricmp(aargv[3],"16")))
  314.     {
  315.      gfxversion = 37;
  316.     }
  317.    else if (!(stricmp(aargv[3],"15KHZ")))
  318.     {
  319.      v15Khz = 1;
  320.     }
  321.    else
  322.     {
  323.      procpri=atoi(aargv[3]);
  324.      if (procpri < 0)
  325.        procpri = 0;
  326.      if (procpri > 4)
  327.       procpri = 4;
  328.     }
  329.   }
  330.  Delay(3L);
  331.  myproc = (struct Process *)FindTask(0L);
  332.  tempxx = myproc->pr_WindowPtr;
  333.  Delay(3L);
  334.  myproc->pr_WindowPtr = (APTR)-1L;
  335.  if (!(fp = Open("uchess:uchess.lang",MODE_OLDFILE)))
  336.   {
  337.    system("Assign >nil: uchess: \"\"");
  338.   }
  339.  else
  340.   Close(fp);
  341.  myproc->pr_WindowPtr = tempxx;
  342. #endif
  343.  
  344.   
  345.   srand (starttime = ((unsigned int) time ((long *) 0)));    /* init urand */
  346. #ifdef ttblsz
  347.   ttblsize = ttblsz;
  348.   rehash = -1;
  349. #endif /* ttblsz */
  350.   flag.easy = 0;
  351. #ifndef AMIGA
  352.   if (argc > 2)
  353.     {
  354.       if (argv[1][0] == '-' && argv[1][1] == 'L')
  355.     {
  356.       Lang = argv[2];
  357.       argv += 2;
  358.       argc -= 2;
  359.     }
  360.     }
  361. #endif
  362.   InitConst (Lang);
  363.   ColorStr[0] = CP[118];
  364.   ColorStr[1] = CP[119];
  365.  
  366. #ifndef AMIGA
  367.   while (argc > 1 && ((argv[1][0] == '-') || (argv[1][0] == '+')))
  368.     {
  369.       switch (argv[1][1])
  370.     {
  371.     case 'a':
  372.       ahead = ((argv[1][0] == '-') ? false : true);
  373.       break;
  374.     case 'h':
  375.       hash = ((argv[1][0] == '-') ? false : true);
  376.       break;
  377.     case 's':
  378.       argc--;
  379.       argv++;
  380.       if (argc > 1)
  381.         strcpy (savefile, argv[1]);
  382.       break;
  383.     case 'l':
  384.       argc--;
  385.       argv++;
  386.       if (argc > 1)
  387.         strcpy (listfile, argv[1]);
  388.       break;
  389.  
  390. #if ttblsz
  391.     case 'r':
  392.       if (argc > 2)
  393.         rehash = atoi (argv[2]);
  394.       argc--;
  395.       argv++;
  396.       if (rehash > MAXrehash)
  397.         rehash = MAXrehash;
  398.       break;
  399.     case 'T':
  400.       if (argc > 2)
  401.         ttblsize = atoi (argv[2]);
  402.       argc--;
  403.       argv++;
  404.       if (ttblsize > 0 && ttblsize < 24)
  405.         ttblsize = (1 << ttblsize);
  406.       else
  407.         ttblsize = ttblsz;
  408.       break;
  409. #ifdef HASHFILE
  410.     case 't':        /* create or test persistent transposition
  411.                  * table */
  412.       hashfile = fopen (HASHFILE, RWA_ACC);
  413.       if (hashfile)
  414.         {
  415.           fseek (hashfile, 0L, SEEK_END);
  416.           filesz = (ftell (hashfile) / sizeof (struct fileentry)) - 1;
  417.         }
  418.       if (hashfile != NULL)
  419.         {
  420.           long i, j;
  421.           int nr[MAXDEPTH];
  422.           struct fileentry n;
  423.  
  424.           /*ShowMessage (CP[49]);*/
  425.           for (i = 0; i < MAXDEPTH; i++)
  426.         nr[i] = 0;
  427.           fseek (hashfile, 0L, SEEK_END);
  428.           i = ftell (hashfile) / sizeof (struct fileentry);
  429.           fseek (hashfile, 0L, SEEK_SET);
  430.           for (j = 0; j < i + 1; j++)
  431.         {
  432.           fread (&n, sizeof (struct fileentry), 1, hashfile);
  433.           if (n.depth)
  434.             {
  435.               nr[n.depth]++;
  436.               nr[0]++;
  437.             }
  438.         }
  439.           sprintf (astr,CP[109],
  440.               nr[0], i);
  441.               /*ShowMessage(astr);*/
  442.           for (j = 1; j < MAXDEPTH; j++)
  443.                /*
  444.         printf ("%d ", nr[j]);
  445.           printf ("\n")*/;
  446.         }
  447.       return 0;
  448.     case 'c':        /* create or test persistent transposition
  449.                  * table */
  450.       if (argc > 2)
  451.         filesz = atoi (argv[2]);
  452.       if (filesz > 0 && filesz < 24)
  453.         filesz = (1 << filesz) - 1 + MAXrehash;
  454.       else
  455.         filesz = Deffilesz + MAXrehash;
  456.       if ((hashfile = fopen (HASHFILE, RWA_ACC)) == NULL)
  457.         hashfile = fopen (HASHFILE, WA_ACC);
  458.       if (hashfile != NULL)
  459.         {
  460.           long j;
  461.           struct fileentry n;
  462.  
  463.           /*printf (CP[66]);*/
  464.           for (j = 0; j < 32; j++)
  465.         n.bd[j] = 0;
  466.           n.f = n.t = 0;
  467.           n.flags = 0;
  468.           n.depth = 0;
  469.           n.sh = n.sl = 0;
  470.           for (j = 0; j < filesz + 1; j++)
  471.         fwrite (&n, sizeof (struct fileentry), 1, hashfile);
  472.           fclose (hashfile);
  473.         }
  474.      /* else
  475.         printf (CP[50], HASHFILE);*/
  476.       return (0);
  477. #endif /* HASHFILE */
  478. #endif /* ttblsz */
  479.     case 'x':
  480.       xwin = &argv[1][2];
  481.       break;
  482.     case 'v':
  483.       fprintf (stderr, CP[102], version, patchlevel);
  484.       exit (1);
  485.     default:
  486.       fprintf (stderr, CP[113]);
  487.       exit (1);
  488.     }
  489.       argv++;
  490.       argc--;
  491.     }
  492. #endif
  493.   XC = 0;
  494.   MaxResponseTime = 0;
  495. #if defined CHESSTOOL || defined XBOARD
  496.   signal (SIGTERM, TerminateChess);
  497.   TCflag = true;
  498.   TCmoves = 40;
  499.   TCminutes = 120;
  500.   TCseconds = 0;
  501.   TCadd = 0;
  502.   OperatorTime = 0;
  503. #else
  504. /*  TCflag = false;*/
  505. /*  OperatorTime = 0;*/
  506.   TCflag = true;
  507.   TCmoves = 60;
  508.   TCminutes = 10;
  509.   TCseconds = 0;
  510.   OperatorTime = 0;
  511. #endif
  512. #ifndef AMIGA
  513.   if (argc == 2)
  514.     {
  515.       char *p;
  516.  
  517.       MaxResponseTime = 100L*strtol(argv[1], &p, 10);
  518.       if (*p == ':')
  519.     MaxResponseTime = 60L*MaxResponseTime + 
  520.         100L*strtol(++p, (char **) NULL, 10);
  521.       TCflag = false;
  522.       TCmoves = 0;
  523.       TCminutes = 0;
  524.       TCseconds = 0;
  525.     }
  526.   if (argc >= 3)
  527.     {
  528.       char *p;
  529.       if (argc > 9)
  530.     {
  531.      /* printf ("%s\n", CP[220]);*/
  532.       exit (1);
  533.     }
  534.       TCmoves = atoi (argv[1]);
  535.       TCminutes = strtol (argv[2], &p, 10);
  536.       if (*p == ':')
  537.     TCseconds = strtol (p + 1, (char **) NULL, 10);
  538.       else
  539.     TCseconds = 0;
  540.       TCflag = true;
  541.       argc -= 3;
  542.       argv += 3;
  543.       while (argc > 1)
  544.     {
  545.       XCmoves[XC] = atoi (argv[0]);
  546.       XCminutes[XC] = strtol (argv[1], &p, 10);
  547.       if (*p == ':')
  548.         XCseconds[XC] = strtol (p + 1, (char **) NULL, 10);
  549.       else
  550.         XCseconds[XC] = 0;
  551.       if (XCmoves[XC] && (XCminutes[XC] || XCseconds[XC]))
  552.         XC++;
  553.       else
  554.         {
  555.           /*printf (CP[220]);*/
  556.           exit (1);
  557.         }
  558.       argc -= 2;
  559.       argv += 2;
  560.     }
  561.       if (argc)
  562.     {
  563.       /*printf ("%s\n", CP[220]);*/
  564.       exit (1);
  565.     }
  566.     }
  567. #endif /* AMIGA */
  568. #ifdef AMIGA
  569.  if (!AmigaStartup())
  570.   {
  571.    exit(2);
  572.   }
  573. #endif
  574.   Initialize ();
  575. #ifndef CACHE
  576. #ifdef ttblsz
  577.   Initialize_ttable ();
  578. #endif /* ttblsz */
  579. #endif
  580.   Initialize_dist ();
  581.   Initialize_moves ();
  582.   FirstTime = 1;
  583.   NewGame ();
  584.   flag.easy = ahead;
  585.   flag.hash = hash;
  586.   if (xwin)
  587.     xwndw = atoi (xwin);
  588.  
  589.   hashfile = NULL;
  590. #if ttblsz
  591. #ifdef HASHFILE
  592.   hashfile = fopen (HASHFILE, RWA_ACC);
  593.   if (hashfile)
  594.     {
  595.       fseek (hashfile, 0L, SEEK_END);
  596.       filesz = ftell (hashfile) / sizeof (struct fileentry) - 1;
  597.     }
  598. #if !defined CHESSTOOL && !defined XBOARD
  599.   else
  600.     ShowMessage (CP[98]);
  601. #endif
  602. #endif /* HASHFILE */
  603. #endif /* ttblsz */
  604. #ifdef AMIGA
  605.  (void)SetTaskPri((struct Task *)myproc,procpri);
  606.  Delay(3L);
  607.  SetMenuStrip(wG,&MenuList1);    /* attach any Menu */
  608.  MenuStripSet = 1;
  609. #endif
  610.   while (!(flag.quit))
  611.     {
  612.       if (flag.bothsides && !flag.mate)
  613.        {
  614.         SetPointer(wG,myPointer,PTRHEIGHT,0x10L,0L,0L);
  615.     SelectMove (opponent, 1);
  616.        }
  617.       else
  618.         {
  619.       InputCommand (cstring);
  620.         }
  621.  
  622.       if (opponent == black)
  623.     if (flag.gamein || TCadd)
  624.       {
  625.         TimeCalc ();
  626.       }
  627.     else if (TimeControl.moves[opponent] == 0)
  628.       {
  629.         if (XC)
  630.           if (XCmore < XC)
  631.         {
  632.           TCmoves = XCmoves[XCmore];
  633.           TCminutes = XCminutes[XCmore];
  634.           TCseconds = XCseconds[XCmore];
  635.           XCmore++;
  636.         }
  637.         SetTimeControl ();
  638.       }
  639.  
  640.       compptr = (compptr + 1) % MINGAMEIN;
  641.  
  642.  
  643.       if (SupervisorMode)
  644.        {
  645.       computer = computer ^ 1;
  646.       opponent = opponent ^ 1;
  647.       xwndw = (computer == white) ? WXWNDW : BXWNDW;
  648.       flag.force = false;
  649.       Sdepth = 0;
  650.        }
  651.       else if (!(flag.quit || flag.mate || flag.force))
  652.     {
  653.           SetPointer(wG,myPointer,PTRHEIGHT,0x10L,0L,0L);
  654.       SelectMove (computer, 1);
  655.       if (computer == black)
  656.         if (flag.gamein)
  657.           {
  658.         TimeCalc ();
  659.           }
  660.         else if (TimeControl.moves[computer] == 0)
  661.           {
  662.         if (XC)
  663.           if (XCmore < XC)
  664.             {
  665.               TCmoves = XCmoves[XCmore];
  666.               TCminutes = XCminutes[XCmore];
  667.               TCseconds = XCseconds[XCmore];
  668.               XCmore++;
  669.             }
  670.         SetTimeControl ();
  671.           }
  672.     }
  673.       if ((flag.mate)&&(!Mate)&&(!DrawnGame))
  674.        ShowMessage("CheckMate");
  675.       if (Mate)
  676.        {
  677.         ShowMessage(MateString);
  678.        }
  679.       else if (DrawnGame)
  680.        {
  681.         ShowMessage("Draw..");
  682.        }
  683.     }
  684. #if ttblsz
  685. #ifdef HASHFILE
  686.   if (hashfile)
  687.     fclose (hashfile);
  688. #endif /* HASHFILE */
  689. #endif /* ttblsz */
  690.  
  691.   ExitChess ();
  692. }
  693.